/**
 * @Author: YangYun
 * @Date: 2020/7/27 15:28
 */
package pay

import (
	"context"

	"git.900sui.cn/kc/base/common/toolLib"
	"git.900sui.cn/kc/rpcPay/common/models"
	_const "git.900sui.cn/kc/rpcPay/lang/const"
	"git.900sui.cn/kc/rpcinterface/interface/bus"
	"git.900sui.cn/kc/rpcinterface/interface/order"
	pay2 "git.900sui.cn/kc/rpcinterface/interface/pay"
	"github.com/tidwall/gjson"
)

type Pay interface {
	// 二维码支付
	PayQr(info *pay2.PayInfo) (string, error)
	// h5支付
	PayH5(info *pay2.PayInfo) (string, error)
	// h5支付升级版本
	PayH5New(info *pay2.PayInfo, res *pay2.PayH5) error
	//微信小程序支付
	PayWxApp(info *pay2.PayInfo) (*gjson.Result, error)
	//微信公众号支付
	PayWxOfficial(info *pay2.PayInfo) (*gjson.Result, error)
	//微信/支付宝app支付
	PayApp(info *pay2.PayInfo) (*gjson.Result, error)
	// app支付签名
	PayAppSign(info *pay2.PayInfo) (string, error)
	// 支付回调
	Notify(data string) (*pay2.PayNotify, error)
	//异步回调响应
	NotifyResponse(ctx context.Context, args *pay2.ArgsNotify) (*pay2.ReplyNotifyResponse, error)
	// 获取支付成功后金额处理
	PayFund(notify *pay2.PayNotify, bill *order.ReplyGetOrderSplitBill) []bus.FundRecordItem
	// 获取清分金额
	GetFundAmount(notify *pay2.PayNotify, bill *order.ReplyGetOrderSplitBill) string
	// 获取支付渠道类型
	GetType() int
	// 资金清分【商家】
	AgentChannel(busClearingModel *models.BusClearingModel, list map[string]interface{}) (id int, err error)
	// 资金清分【平台】
	AgentChannelPlat(platClearingModel *models.PlatformClearingModel, list map[string]interface{}) (id int, err error)
	// 资金清分【保险-正常】
	AgentChannelInsure(insureClearingModel *models.InsureClearingModel, list map[string]interface{}) (id int, err error)
	// 资金清分【保险-续保】
	AgentChannelRenewInsure(renewInsureClearingModel *models.RenewInsureClearingModel, list map[string]interface{}) (id int, err error)
	// 获取保险费用是否需要清分
	GetInsureFund() bool
}

//获取支付渠道对象
func GetPay(payChannel int) (*Pay, error) {
	switch payChannel {
	case order.PAY_CHANNEL_ccb:
		p := Pay(new(ccb))
		return &p, nil
	case order.PAY_CHANNEL_sand:
		p := Pay(new(sandPay))
		return &p, nil
	case order.PAY_CHANNEL_icbc:
		p := Pay(new(icbc))
		return &p, nil
	case order.PAY_CHANNEL_pingan:
		p := Pay(new(pinganpay))
		return &p, nil
	case order.PAY_CHANNEL_pingpp:
		p := Pay(new(pingpp))
		return &p, nil
	case order.PAY_CHANNEL_xindalu:
		p := Pay(new(xindalupay))
		return &p,nil
	}
	return nil, toolLib.CreateKcErr(_const.PAY_CHANNEL_ERROR)
}

// 建行清分处理
func AgentCcb(ctx context.Context) {
	new(ccb).RunAgent(ctx)
}

// 建行清分结果获取处理
func AgentCcbFund(ctx context.Context) bool {
	return new(ccb).FundAgent(ctx)
}

// 杉德清分处理【商家】
func AgentSand(ctx context.Context) bool {
	return new(sandPay).FundAgent(ctx)
}

// 杉德清分未实时结果延时处理【商家】
func AgentSandFund(ctx context.Context) bool {
	return new(sandPay).FundAgentResult(ctx)
}

// 杉德清分处理【商家】
func AgentSandPlat(ctx context.Context) bool {
	return new(sandPay).PlatFundAgent(ctx)
}

// 杉德清分未实时结果延时处理【商家】
func AgentSandFundPlat(ctx context.Context) bool {
	return new(sandPay).PlatFundAgentResult(ctx)
}

// 杉德保险公司资金清分处理【保险公司】
func AgentSandInsure(ctx context.Context) bool {
	return new(sandPay).InsureFundAgent(ctx)
}

// 杉德保险公司资金清分未实时结果延时处理【保险公司】
func AgentSandFundInsure(ctx context.Context) bool {
	return new(sandPay).InsureFundAgentResult(ctx)
}

// 杉德续保公司资金清分处理
func AgentSandRenewInsure(ctx context.Context) bool {
	return new(sandPay).RenewInsureFundAgent(ctx)
}

// 杉德续保公司资金清分未实时结果延时处理
func AgentSandFundRenewInsure(ctx context.Context) bool {
	return new(sandPay).RenewInsureFundAgentResult(ctx)
}

// 共享卡资金清分处理
func AgentSandShareCard(ctx context.Context) bool {
	return new(sandPay).ShareCardFundAgent(ctx)
}

// 共享卡资金清分未实时结果延时处理
func AgentSandFundShareCard(ctx context.Context) bool {
	return new(sandPay).ShareCardFundAgentResult(ctx)
}
